//     __ _____ _____ _____
//  __|  |   __|     |   | |  JSON for Modern C++
// |  |  |__   |  |  | | | |  version 3.11.3
// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT

#pragma once

#include <nlohmann/detail/meta/detected.hpp>
#include <nlohmann/thirdparty/hedley/hedley.hpp>
#include <utility>  // declval, pair

// This file contains all internal macro definitions (except those affecting
// ABI) You MUST include macro_unscope.hpp at the end of json.hpp to undef all
// of them

#include <nlohmann/detail/abi_macros.hpp>

// exclude unsupported compilers
#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK)
#if defined(__clang__)
#if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < \
    30400
#error \
    "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers"
#endif
#elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER))
#if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800
#error \
    "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers"
#endif
#endif
#endif

// C++ language standard detection
// if the user manually specified the used c++ version this is skipped
#if !defined(JSON_HAS_CPP_20) && !defined(JSON_HAS_CPP_17) && \
    !defined(JSON_HAS_CPP_14) && !defined(JSON_HAS_CPP_11)
#if (defined(__cplusplus) && __cplusplus >= 202002L) || \
    (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L)
// #define JSON_HAS_CPP_20
// #define JSON_HAS_CPP_17
#define JSON_HAS_CPP_14
#elif (defined(__cplusplus) && __cplusplus >= 201703L) || \
    (defined(_HAS_CXX17) && _HAS_CXX17 == 1)  // fix for issue #464
// #define JSON_HAS_CPP_17
#define JSON_HAS_CPP_14
#elif (defined(__cplusplus) && __cplusplus >= 201402L) || \
    (defined(_HAS_CXX14) && _HAS_CXX14 == 1)
#define JSON_HAS_CPP_14
#endif
// the cpp 11 flag is always specified because it is the minimal required
// version
#define JSON_HAS_CPP_11
#endif

#ifdef __has_include
#if __has_include(<version>)
#include <version>
#endif
#endif

#if !defined(JSON_HAS_FILESYSTEM) && !defined(JSON_HAS_EXPERIMENTAL_FILESYSTEM)
#ifdef JSON_HAS_CPP_17
#if defined(__cpp_lib_filesystem)
#define JSON_HAS_FILESYSTEM 1
#elif defined(__cpp_lib_experimental_filesystem)
#define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1
#elif !defined(__has_include)
#define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1
#elif __has_include(<filesystem>)
#define JSON_HAS_FILESYSTEM 1
#elif __has_include(<experimental/filesystem>)
#define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1
#endif

// std::filesystem does not work on MinGW GCC 8:
// https://sourceforge.net/p/mingw-w64/bugs/737/
#if defined(__MINGW32__) && defined(__GNUC__) && __GNUC__ == 8
#undef JSON_HAS_FILESYSTEM
#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
#endif

// no filesystem support before GCC 8:
// https://en.cppreference.com/w/cpp/compiler_support
#if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 8
#undef JSON_HAS_FILESYSTEM
#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
#endif

// no filesystem support before Clang 7:
// https://en.cppreference.com/w/cpp/compiler_support
#if defined(__clang_major__) && __clang_major__ < 7
#undef JSON_HAS_FILESYSTEM
#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
#endif

// no filesystem support before MSVC 19.14:
// https://en.cppreference.com/w/cpp/compiler_support
#if defined(_MSC_VER) && _MSC_VER < 1914
#undef JSON_HAS_FILESYSTEM
#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
#endif

// no filesystem support before iOS 13
#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && \
    __IPHONE_OS_VERSION_MIN_REQUIRED < 130000
#undef JSON_HAS_FILESYSTEM
#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
#endif

// no filesystem support before macOS Catalina
#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && \
    __MAC_OS_X_VERSION_MIN_REQUIRED < 101500
#undef JSON_HAS_FILESYSTEM
#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
#endif
#endif
#endif

#ifndef JSON_HAS_EXPERIMENTAL_FILESYSTEM
#define JSON_HAS_EXPERIMENTAL_FILESYSTEM 0
#endif

#ifndef JSON_HAS_FILESYSTEM
#define JSON_HAS_FILESYSTEM 0
#endif

#ifndef JSON_HAS_THREE_WAY_COMPARISON
#if defined(__cpp_impl_three_way_comparison) &&   \
    __cpp_impl_three_way_comparison >= 201907L && \
    defined(__cpp_lib_three_way_comparison) &&    \
    __cpp_lib_three_way_comparison >= 201907L
#define JSON_HAS_THREE_WAY_COMPARISON 1
#else
#define JSON_HAS_THREE_WAY_COMPARISON 0
#endif
#endif

#ifndef JSON_HAS_RANGES
// ranges header shipping in GCC 11.1.0 (released 2021-04-27) has syntax error
#if defined(__GLIBCXX__) && __GLIBCXX__ == 20210427
#define JSON_HAS_RANGES 0
#elif defined(__cpp_lib_ranges)
#define JSON_HAS_RANGES 1
#else
#define JSON_HAS_RANGES 0
#endif
#endif

#ifndef JSON_HAS_STATIC_RTTI
#if !defined(_HAS_STATIC_RTTI) || _HAS_STATIC_RTTI != 0
#define JSON_HAS_STATIC_RTTI 1
#else
#define JSON_HAS_STATIC_RTTI 0
#endif
#endif

#ifdef JSON_HAS_CPP_17
#define JSON_INLINE_VARIABLE inline
#else
#define JSON_INLINE_VARIABLE
#endif

#if JSON_HEDLEY_HAS_ATTRIBUTE(no_unique_address)
#define JSON_NO_UNIQUE_ADDRESS [[no_unique_address]]
#else
#define JSON_NO_UNIQUE_ADDRESS
#endif

// disable documentation warnings on clang
#if defined(__clang__)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdocumentation"
#pragma clang diagnostic ignored "-Wdocumentation-unknown-command"
#endif

// allow disabling exceptions
#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || \
     defined(_CPPUNWIND)) &&                               \
    !defined(JSON_NOEXCEPTION)
#define JSON_THROW(exception) throw exception
#define JSON_TRY try
#define JSON_CATCH(exception) catch (exception)
#define JSON_INTERNAL_CATCH(exception) catch (exception)
#else
#include <cstdlib>
#define JSON_THROW(exception) std::abort()
#define JSON_TRY if (true)
#define JSON_CATCH(exception) if (false)
#define JSON_INTERNAL_CATCH(exception) if (false)
#endif

// override exception macros
#if defined(JSON_THROW_USER)
#undef JSON_THROW
#define JSON_THROW JSON_THROW_USER
#endif
#if defined(JSON_TRY_USER)
#undef JSON_TRY
#define JSON_TRY JSON_TRY_USER
#endif
#if defined(JSON_CATCH_USER)
#undef JSON_CATCH
#define JSON_CATCH JSON_CATCH_USER
#undef JSON_INTERNAL_CATCH
#define JSON_INTERNAL_CATCH JSON_CATCH_USER
#endif
#if defined(JSON_INTERNAL_CATCH_USER)
#undef JSON_INTERNAL_CATCH
#define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER
#endif

// allow overriding assert
#if !defined(JSON_ASSERT)
#include <cassert>  // assert
#define JSON_ASSERT(x) assert(x)
#endif

// allow to access some private functions (needed by the test suite)
#if defined(JSON_TESTS_PRIVATE)
#define JSON_PRIVATE_UNLESS_TESTED public
#else
#define JSON_PRIVATE_UNLESS_TESTED private
#endif

/*!
@brief macro to briefly define a mapping between an enum and JSON
@def NLOHMANN_JSON_SERIALIZE_ENUM
@since version 3.4.0
*/
#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...)                       \
  template <typename BasicJsonType>                                        \
  inline void to_json(BasicJsonType &j, const ENUM_TYPE &e) {              \
    static_assert(std::is_enum<ENUM_TYPE>::value,                          \
                  #ENUM_TYPE " must be an enum!");                         \
    static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__;    \
    auto it = std::find_if(                                                \
        std::begin(m), std::end(m),                                        \
        [e](const std::pair<ENUM_TYPE, BasicJsonType> &ej_pair) -> bool {  \
          return ej_pair.first == e;                                       \
        });                                                                \
    j = ((it != std::end(m)) ? it : std::begin(m))->second;                \
  }                                                                        \
  template <typename BasicJsonType>                                        \
  inline void from_json(const BasicJsonType &j, ENUM_TYPE &e) {            \
    static_assert(std::is_enum<ENUM_TYPE>::value,                          \
                  #ENUM_TYPE " must be an enum!");                         \
    static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__;    \
    auto it = std::find_if(                                                \
        std::begin(m), std::end(m),                                        \
        [&j](const std::pair<ENUM_TYPE, BasicJsonType> &ej_pair) -> bool { \
          return ej_pair.second == j;                                      \
        });                                                                \
    e = ((it != std::end(m)) ? it : std::begin(m))->first;                 \
  }

// Ugly macros to avoid uglier copy-paste when specializing basic_json. They
// may be removed in the future once the class is split.

#define NLOHMANN_BASIC_JSON_TPL_DECLARATION                               \
  template <template <typename, typename, typename...> class ObjectType,  \
            template <typename, typename...> class ArrayType,             \
            class StringType, class BooleanType, class NumberIntegerType, \
            class NumberUnsignedType, class NumberFloatType,              \
            template <typename> class AllocatorType,                      \
            template <typename, typename = void> class JSONSerializer,    \
            class BinaryType, class CustomBaseClass>

#define NLOHMANN_BASIC_JSON_TPL                                      \
  basic_json<ObjectType, ArrayType, StringType, BooleanType,         \
             NumberIntegerType, NumberUnsignedType, NumberFloatType, \
             AllocatorType, JSONSerializer, BinaryType, CustomBaseClass>

// Macros to simplify conversion from/to types

#define NLOHMANN_JSON_EXPAND(x) x
#define NLOHMANN_JSON_GET_MACRO(                                               \
    _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16,     \
    _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, \
    _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, \
    _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, \
    _62, _63, _64, NAME, ...)                                                  \
  NAME
#define NLOHMANN_JSON_PASTE(...)                                           \
  NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_GET_MACRO(                            \
      __VA_ARGS__, NLOHMANN_JSON_PASTE64, NLOHMANN_JSON_PASTE63,           \
      NLOHMANN_JSON_PASTE62, NLOHMANN_JSON_PASTE61, NLOHMANN_JSON_PASTE60, \
      NLOHMANN_JSON_PASTE59, NLOHMANN_JSON_PASTE58, NLOHMANN_JSON_PASTE57, \
      NLOHMANN_JSON_PASTE56, NLOHMANN_JSON_PASTE55, NLOHMANN_JSON_PASTE54, \
      NLOHMANN_JSON_PASTE53, NLOHMANN_JSON_PASTE52, NLOHMANN_JSON_PASTE51, \
      NLOHMANN_JSON_PASTE50, NLOHMANN_JSON_PASTE49, NLOHMANN_JSON_PASTE48, \
      NLOHMANN_JSON_PASTE47, NLOHMANN_JSON_PASTE46, NLOHMANN_JSON_PASTE45, \
      NLOHMANN_JSON_PASTE44, NLOHMANN_JSON_PASTE43, NLOHMANN_JSON_PASTE42, \
      NLOHMANN_JSON_PASTE41, NLOHMANN_JSON_PASTE40, NLOHMANN_JSON_PASTE39, \
      NLOHMANN_JSON_PASTE38, NLOHMANN_JSON_PASTE37, NLOHMANN_JSON_PASTE36, \
      NLOHMANN_JSON_PASTE35, NLOHMANN_JSON_PASTE34, NLOHMANN_JSON_PASTE33, \
      NLOHMANN_JSON_PASTE32, NLOHMANN_JSON_PASTE31, NLOHMANN_JSON_PASTE30, \
      NLOHMANN_JSON_PASTE29, NLOHMANN_JSON_PASTE28, NLOHMANN_JSON_PASTE27, \
      NLOHMANN_JSON_PASTE26, NLOHMANN_JSON_PASTE25, NLOHMANN_JSON_PASTE24, \
      NLOHMANN_JSON_PASTE23, NLOHMANN_JSON_PASTE22, NLOHMANN_JSON_PASTE21, \
      NLOHMANN_JSON_PASTE20, NLOHMANN_JSON_PASTE19, NLOHMANN_JSON_PASTE18, \
      NLOHMANN_JSON_PASTE17, NLOHMANN_JSON_PASTE16, NLOHMANN_JSON_PASTE15, \
      NLOHMANN_JSON_PASTE14, NLOHMANN_JSON_PASTE13, NLOHMANN_JSON_PASTE12, \
      NLOHMANN_JSON_PASTE11, NLOHMANN_JSON_PASTE10, NLOHMANN_JSON_PASTE9,  \
      NLOHMANN_JSON_PASTE8, NLOHMANN_JSON_PASTE7, NLOHMANN_JSON_PASTE6,    \
      NLOHMANN_JSON_PASTE5, NLOHMANN_JSON_PASTE4, NLOHMANN_JSON_PASTE3,    \
      NLOHMANN_JSON_PASTE2, NLOHMANN_JSON_PASTE1)(__VA_ARGS__))
#define NLOHMANN_JSON_PASTE2(func, v1) func(v1)
#define NLOHMANN_JSON_PASTE3(func, v1, v2) \
  NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE2(func, v2)
#define NLOHMANN_JSON_PASTE4(func, v1, v2, v3) \
  NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE3(func, v2, v3)
#define NLOHMANN_JSON_PASTE5(func, v1, v2, v3, v4) \
  NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE4(func, v2, v3, v4)
#define NLOHMANN_JSON_PASTE6(func, v1, v2, v3, v4, v5) \
  NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE5(func, v2, v3, v4, v5)
#define NLOHMANN_JSON_PASTE7(func, v1, v2, v3, v4, v5, v6) \
  NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE6(func, v2, v3, v4, v5, v6)
#define NLOHMANN_JSON_PASTE8(func, v1, v2, v3, v4, v5, v6, v7) \
  NLOHMANN_JSON_PASTE2(func, v1)                               \
  NLOHMANN_JSON_PASTE7(func, v2, v3, v4, v5, v6, v7)
#define NLOHMANN_JSON_PASTE9(func, v1, v2, v3, v4, v5, v6, v7, v8) \
  NLOHMANN_JSON_PASTE2(func, v1)                                   \
  NLOHMANN_JSON_PASTE8(func, v2, v3, v4, v5, v6, v7, v8)
#define NLOHMANN_JSON_PASTE10(func, v1, v2, v3, v4, v5, v6, v7, v8, v9) \
  NLOHMANN_JSON_PASTE2(func, v1)                                        \
  NLOHMANN_JSON_PASTE9(func, v2, v3, v4, v5, v6, v7, v8, v9)
#define NLOHMANN_JSON_PASTE11(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) \
  NLOHMANN_JSON_PASTE2(func, v1)                                             \
  NLOHMANN_JSON_PASTE10(func, v2, v3, v4, v5, v6, v7, v8, v9, v10)
#define NLOHMANN_JSON_PASTE12(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, \
                              v11)                                           \
  NLOHMANN_JSON_PASTE2(func, v1)                                             \
  NLOHMANN_JSON_PASTE11(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11)
#define NLOHMANN_JSON_PASTE13(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, \
                              v11, v12)                                      \
  NLOHMANN_JSON_PASTE2(func, v1)                                             \
  NLOHMANN_JSON_PASTE12(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12)
#define NLOHMANN_JSON_PASTE14(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, \
                              v11, v12, v13)                                 \
  NLOHMANN_JSON_PASTE2(func, v1)                                             \
  NLOHMANN_JSON_PASTE13(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, \
                        v13)
#define NLOHMANN_JSON_PASTE15(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, \
                              v11, v12, v13, v14)                            \
  NLOHMANN_JSON_PASTE2(func, v1)                                             \
  NLOHMANN_JSON_PASTE14(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, \
                        v13, v14)
#define NLOHMANN_JSON_PASTE16(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, \
                              v11, v12, v13, v14, v15)                       \
  NLOHMANN_JSON_PASTE2(func, v1)                                             \
  NLOHMANN_JSON_PASTE15(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, \
                        v13, v14, v15)
#define NLOHMANN_JSON_PASTE17(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, \
                              v11, v12, v13, v14, v15, v16)                  \
  NLOHMANN_JSON_PASTE2(func, v1)                                             \
  NLOHMANN_JSON_PASTE16(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, \
                        v13, v14, v15, v16)
#define NLOHMANN_JSON_PASTE18(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, \
                              v11, v12, v13, v14, v15, v16, v17)             \
  NLOHMANN_JSON_PASTE2(func, v1)                                             \
  NLOHMANN_JSON_PASTE17(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, \
                        v13, v14, v15, v16, v17)
#define NLOHMANN_JSON_PASTE19(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, \
                              v11, v12, v13, v14, v15, v16, v17, v18)        \
  NLOHMANN_JSON_PASTE2(func, v1)                                             \
  NLOHMANN_JSON_PASTE18(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, \
                        v13, v14, v15, v16, v17, v18)
#define NLOHMANN_JSON_PASTE20(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, \
                              v11, v12, v13, v14, v15, v16, v17, v18, v19)   \
  NLOHMANN_JSON_PASTE2(func, v1)                                             \
  NLOHMANN_JSON_PASTE19(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, \
                        v13, v14, v15, v16, v17, v18, v19)
#define NLOHMANN_JSON_PASTE21(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, \
                              v11, v12, v13, v14, v15, v16, v17, v18, v19,   \
                              v20)                                           \
  NLOHMANN_JSON_PASTE2(func, v1)                                             \
  NLOHMANN_JSON_PASTE20(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, \
                        v13, v14, v15, v16, v17, v18, v19, v20)
#define NLOHMANN_JSON_PASTE22(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, \
                              v11, v12, v13, v14, v15, v16, v17, v18, v19,   \
                              v20, v21)                                      \
  NLOHMANN_JSON_PASTE2(func, v1)                                             \
  NLOHMANN_JSON_PASTE21(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21)
#define NLOHMANN_JSON_PASTE23(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, \
                              v11, v12, v13, v14, v15, v16, v17, v18, v19,   \
                              v20, v21, v22)                                 \
  NLOHMANN_JSON_PASTE2(func, v1)                                             \
  NLOHMANN_JSON_PASTE22(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22)
#define NLOHMANN_JSON_PASTE24(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, \
                              v11, v12, v13, v14, v15, v16, v17, v18, v19,   \
                              v20, v21, v22, v23)                            \
  NLOHMANN_JSON_PASTE2(func, v1)                                             \
  NLOHMANN_JSON_PASTE23(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23)
#define NLOHMANN_JSON_PASTE25(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,   \
                              v11, v12, v13, v14, v15, v16, v17, v18, v19,     \
                              v20, v21, v22, v23, v24)                         \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE24(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24)
#define NLOHMANN_JSON_PASTE26(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,   \
                              v11, v12, v13, v14, v15, v16, v17, v18, v19,     \
                              v20, v21, v22, v23, v24, v25)                    \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE25(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25)
#define NLOHMANN_JSON_PASTE27(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,   \
                              v11, v12, v13, v14, v15, v16, v17, v18, v19,     \
                              v20, v21, v22, v23, v24, v25, v26)               \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE26(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26)
#define NLOHMANN_JSON_PASTE28(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,   \
                              v11, v12, v13, v14, v15, v16, v17, v18, v19,     \
                              v20, v21, v22, v23, v24, v25, v26, v27)          \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE27(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27)
#define NLOHMANN_JSON_PASTE29(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,   \
                              v11, v12, v13, v14, v15, v16, v17, v18, v19,     \
                              v20, v21, v22, v23, v24, v25, v26, v27, v28)     \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE28(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28)
#define NLOHMANN_JSON_PASTE30(                                                 \
    func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,    \
    v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29)      \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE29(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29)
#define NLOHMANN_JSON_PASTE31(                                                 \
    func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,    \
    v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE30(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30)
#define NLOHMANN_JSON_PASTE32(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,   \
                              v11, v12, v13, v14, v15, v16, v17, v18, v19,     \
                              v20, v21, v22, v23, v24, v25, v26, v27, v28,     \
                              v29, v30, v31)                                   \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE31(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31)
#define NLOHMANN_JSON_PASTE33(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,   \
                              v11, v12, v13, v14, v15, v16, v17, v18, v19,     \
                              v20, v21, v22, v23, v24, v25, v26, v27, v28,     \
                              v29, v30, v31, v32)                              \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE32(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32)
#define NLOHMANN_JSON_PASTE34(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,   \
                              v11, v12, v13, v14, v15, v16, v17, v18, v19,     \
                              v20, v21, v22, v23, v24, v25, v26, v27, v28,     \
                              v29, v30, v31, v32, v33)                         \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE33(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33)
#define NLOHMANN_JSON_PASTE35(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,   \
                              v11, v12, v13, v14, v15, v16, v17, v18, v19,     \
                              v20, v21, v22, v23, v24, v25, v26, v27, v28,     \
                              v29, v30, v31, v32, v33, v34)                    \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE34(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34)
#define NLOHMANN_JSON_PASTE36(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,   \
                              v11, v12, v13, v14, v15, v16, v17, v18, v19,     \
                              v20, v21, v22, v23, v24, v25, v26, v27, v28,     \
                              v29, v30, v31, v32, v33, v34, v35)               \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE35(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, \
                        v35)
#define NLOHMANN_JSON_PASTE37(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,   \
                              v11, v12, v13, v14, v15, v16, v17, v18, v19,     \
                              v20, v21, v22, v23, v24, v25, v26, v27, v28,     \
                              v29, v30, v31, v32, v33, v34, v35, v36)          \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE36(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, \
                        v35, v36)
#define NLOHMANN_JSON_PASTE38(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,   \
                              v11, v12, v13, v14, v15, v16, v17, v18, v19,     \
                              v20, v21, v22, v23, v24, v25, v26, v27, v28,     \
                              v29, v30, v31, v32, v33, v34, v35, v36, v37)     \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE37(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, \
                        v35, v36, v37)
#define NLOHMANN_JSON_PASTE39(                                                 \
    func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,    \
    v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, \
    v31, v32, v33, v34, v35, v36, v37, v38)                                    \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE38(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, \
                        v35, v36, v37, v38)
#define NLOHMANN_JSON_PASTE40(                                                 \
    func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,    \
    v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, \
    v31, v32, v33, v34, v35, v36, v37, v38, v39)                               \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE39(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, \
                        v35, v36, v37, v38, v39)
#define NLOHMANN_JSON_PASTE41(                                                 \
    func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,    \
    v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, \
    v31, v32, v33, v34, v35, v36, v37, v38, v39, v40)                          \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE40(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, \
                        v35, v36, v37, v38, v39, v40)
#define NLOHMANN_JSON_PASTE42(                                                 \
    func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,    \
    v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, \
    v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41)                     \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE41(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, \
                        v35, v36, v37, v38, v39, v40, v41)
#define NLOHMANN_JSON_PASTE43(                                                 \
    func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,    \
    v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, \
    v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42)                \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE42(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, \
                        v35, v36, v37, v38, v39, v40, v41, v42)
#define NLOHMANN_JSON_PASTE44(                                                 \
    func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,    \
    v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, \
    v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43)           \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE43(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, \
                        v35, v36, v37, v38, v39, v40, v41, v42, v43)
#define NLOHMANN_JSON_PASTE45(                                                 \
    func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,    \
    v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, \
    v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44)      \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE44(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, \
                        v35, v36, v37, v38, v39, v40, v41, v42, v43, v44)
#define NLOHMANN_JSON_PASTE46(                                                 \
    func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,    \
    v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, \
    v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE45(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, \
                        v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45)
#define NLOHMANN_JSON_PASTE47(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,   \
                              v11, v12, v13, v14, v15, v16, v17, v18, v19,     \
                              v20, v21, v22, v23, v24, v25, v26, v27, v28,     \
                              v29, v30, v31, v32, v33, v34, v35, v36, v37,     \
                              v38, v39, v40, v41, v42, v43, v44, v45, v46)     \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE46(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, \
                        v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
                        v46)
#define NLOHMANN_JSON_PASTE48(                                                 \
    func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,    \
    v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, \
    v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
    v46, v47)                                                                  \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE47(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, \
                        v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
                        v46, v47)
#define NLOHMANN_JSON_PASTE49(                                                 \
    func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,    \
    v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, \
    v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
    v46, v47, v48)                                                             \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE48(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, \
                        v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
                        v46, v47, v48)
#define NLOHMANN_JSON_PASTE50(                                                 \
    func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,    \
    v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, \
    v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
    v46, v47, v48, v49)                                                        \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE49(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, \
                        v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
                        v46, v47, v48, v49)
#define NLOHMANN_JSON_PASTE51(                                                 \
    func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,    \
    v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, \
    v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
    v46, v47, v48, v49, v50)                                                   \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE50(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, \
                        v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
                        v46, v47, v48, v49, v50)
#define NLOHMANN_JSON_PASTE52(                                                 \
    func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,    \
    v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, \
    v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
    v46, v47, v48, v49, v50, v51)                                              \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE51(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, \
                        v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
                        v46, v47, v48, v49, v50, v51)
#define NLOHMANN_JSON_PASTE53(                                                 \
    func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,    \
    v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, \
    v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
    v46, v47, v48, v49, v50, v51, v52)                                         \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE52(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, \
                        v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
                        v46, v47, v48, v49, v50, v51, v52)
#define NLOHMANN_JSON_PASTE54(                                                 \
    func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,    \
    v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, \
    v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
    v46, v47, v48, v49, v50, v51, v52, v53)                                    \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE53(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, \
                        v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
                        v46, v47, v48, v49, v50, v51, v52, v53)
#define NLOHMANN_JSON_PASTE55(                                                 \
    func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,    \
    v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, \
    v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
    v46, v47, v48, v49, v50, v51, v52, v53, v54)                               \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE54(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, \
                        v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
                        v46, v47, v48, v49, v50, v51, v52, v53, v54)
#define NLOHMANN_JSON_PASTE56(                                                 \
    func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,    \
    v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, \
    v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
    v46, v47, v48, v49, v50, v51, v52, v53, v54, v55)                          \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE55(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, \
                        v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
                        v46, v47, v48, v49, v50, v51, v52, v53, v54, v55)
#define NLOHMANN_JSON_PASTE57(                                                 \
    func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,    \
    v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, \
    v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
    v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56)                     \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE56(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, \
                        v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
                        v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56)
#define NLOHMANN_JSON_PASTE58(                                                 \
    func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,    \
    v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, \
    v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
    v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57)                \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE57(                                                       \
      func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, \
      v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30,    \
      v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44,    \
      v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57)
#define NLOHMANN_JSON_PASTE59(                                                 \
    func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,    \
    v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, \
    v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
    v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58)           \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE58(                                                       \
      func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, \
      v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30,    \
      v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44,    \
      v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58)
#define NLOHMANN_JSON_PASTE60(                                                 \
    func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,    \
    v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, \
    v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
    v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59)      \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE59(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, \
                        v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
                        v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, \
                        v57, v58, v59)
#define NLOHMANN_JSON_PASTE61(                                                 \
    func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,    \
    v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, \
    v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
    v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE60(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, \
                        v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
                        v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, \
                        v57, v58, v59, v60)
#define NLOHMANN_JSON_PASTE62(                                                 \
    func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,    \
    v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, \
    v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
    v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, \
    v61)                                                                       \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE61(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, \
                        v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
                        v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, \
                        v57, v58, v59, v60, v61)
#define NLOHMANN_JSON_PASTE63(                                                 \
    func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,    \
    v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, \
    v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
    v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, \
    v61, v62)                                                                  \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE62(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, \
                        v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
                        v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, \
                        v57, v58, v59, v60, v61, v62)
#define NLOHMANN_JSON_PASTE64(                                                 \
    func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,    \
    v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, \
    v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
    v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, \
    v61, v62, v63)                                                             \
  NLOHMANN_JSON_PASTE2(func, v1)                                               \
  NLOHMANN_JSON_PASTE63(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,   \
                        v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, \
                        v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, \
                        v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, \
                        v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, \
                        v57, v58, v59, v60, v61, v62, v63)

#define NLOHMANN_JSON_TO(v1) nlohmann_json_j[#v1] = nlohmann_json_t.v1;
#define NLOHMANN_JSON_FROM(v1) \
  nlohmann_json_j.at(#v1).get_to(nlohmann_json_t.v1);
#define NLOHMANN_JSON_FROM_WITH_DEFAULT(v1) \
  nlohmann_json_t.v1 = nlohmann_json_j.value(#v1, nlohmann_json_default_obj.v1);

/*!
@brief macro
@def NLOHMANN_DEFINE_TYPE_INTRUSIVE
@since version 3.9.0
*/
#define NLOHMANN_DEFINE_TYPE_INTRUSIVE(Type, ...)                              \
  friend void to_json(nlohmann::json &nlohmann_json_j,                         \
                      const Type &nlohmann_json_t) {                           \
    NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__))   \
  }                                                                            \
  friend void from_json(const nlohmann::json &nlohmann_json_j,                 \
                        Type &nlohmann_json_t) {                               \
    NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) \
  }

#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Type, ...)               \
  friend void to_json(nlohmann::json &nlohmann_json_j,                       \
                      const Type &nlohmann_json_t) {                         \
    NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) \
  }                                                                          \
  friend void from_json(const nlohmann::json &nlohmann_json_j,               \
                        Type &nlohmann_json_t) {                             \
    const Type nlohmann_json_default_obj{};                                  \
    NLOHMANN_JSON_EXPAND(                                                    \
        NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__))   \
  }

#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_ONLY_SERIALIZE(Type, ...)             \
  friend void to_json(nlohmann::json &nlohmann_json_j,                       \
                      const Type &nlohmann_json_t) {                         \
    NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) \
  }

/*!
@brief macro
@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE
@since version 3.9.0
*/
#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Type, ...)                          \
  inline void to_json(nlohmann::json &nlohmann_json_j,                         \
                      const Type &nlohmann_json_t) {                           \
    NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__))   \
  }                                                                            \
  inline void from_json(const nlohmann::json &nlohmann_json_j,                 \
                        Type &nlohmann_json_t) {                               \
    NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) \
  }

#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE(Type, ...)         \
  inline void to_json(nlohmann::json &nlohmann_json_j,                       \
                      const Type &nlohmann_json_t) {                         \
    NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) \
  }

#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, ...)           \
  inline void to_json(nlohmann::json &nlohmann_json_j,                       \
                      const Type &nlohmann_json_t) {                         \
    NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) \
  }                                                                          \
  inline void from_json(const nlohmann::json &nlohmann_json_j,               \
                        Type &nlohmann_json_t) {                             \
    const Type nlohmann_json_default_obj{};                                  \
    NLOHMANN_JSON_EXPAND(                                                    \
        NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__))   \
  }

// inspired from https://stackoverflow.com/a/26745591
// allows to call any std function as if (e.g. with begin):
// using std::begin; begin(x);
//
// it allows using the detected idiom to retrieve the return type
// of such an expression
#define NLOHMANN_CAN_CALL_STD_FUNC_IMPL(std_name)                              \
  namespace detail {                                                           \
  using std::std_name;                                                         \
                                                                               \
  template <typename... T>                                                     \
  using result_of_##std_name = decltype(std_name(std::declval<T>()...));       \
  }                                                                            \
                                                                               \
  namespace detail2 {                                                          \
  struct std_name##_tag {};                                                    \
                                                                               \
  template <typename... T>                                                     \
  std_name##_tag std_name(T &&...);                                            \
                                                                               \
  template <typename... T>                                                     \
  using result_of_##std_name = decltype(std_name(std::declval<T>()...));       \
                                                                               \
  template <typename... T>                                                     \
  struct would_call_std_##std_name {                                           \
    static constexpr auto const value = ::nlohmann::detail::is_detected_exact< \
        std_name##_tag, result_of_##std_name, T...>::value;                    \
  };                                                                           \
  } /* namespace detail2 */                                                    \
                                                                               \
  template <typename... T>                                                     \
  struct would_call_std_##std_name                                             \
      : detail2::would_call_std_##std_name<T...> {}

#ifndef JSON_USE_IMPLICIT_CONVERSIONS
#define JSON_USE_IMPLICIT_CONVERSIONS 1
#endif

#if JSON_USE_IMPLICIT_CONVERSIONS
#define JSON_EXPLICIT
#else
#define JSON_EXPLICIT explicit
#endif

#ifndef JSON_DISABLE_ENUM_SERIALIZATION
#define JSON_DISABLE_ENUM_SERIALIZATION 0
#endif

#ifndef JSON_USE_GLOBAL_UDLS
#define JSON_USE_GLOBAL_UDLS 1
#endif
